package com.abel.bigwater.dataserver.model.qdies

import com.abel.bigwater.dataserver.model.PacketCmdException
import com.abel.bigwater.dataserver.model.PacketDataLenException
import io.netty.buffer.ByteBuf

/**
 * 脉冲表计参数设置
上位机发送： 帧头 地址 0x2C 0x08 内部表计地址 表计类型
脉冲表初值 脉冲常数 表计整数位数 校验 帧尾
下初值成功， D10应答： 帧头 地址 0x2C 0x02 表计地址 0xAA
校验 帧尾
下初值失败， D10应答： 帧头 地址 0x2C 0x02 表计地址 0xCC
校验 帧尾
内部表计地址 1字节
表计类型 1字节 1： 带正反转的双脉冲
2： 单脉冲
3： 双干簧管脉冲
脉冲表初值 4字节 用float值表示,4字节
脉冲常数 1字节 1： 0.001m3
2： 0.01 m3
3： 0.1 m3
4: 1 m3
表计整数位数 1字节 5
6 7 8
说明： 脉冲表计内部地址范围11-14
 */
class DtenPulseBaseData(_len: Int) : D10BaseData(_len) {
    companion object {
        const val MIN_LEN = 2
    }

    override var type = FuncType.SetPulseBase

    var internalAddress: Byte? = null

    var good = true

    override fun fill(buf: ByteBuf) {
        if (internalAddress!! < 0x0B || internalAddress!! > 0x0E) {
            throw PacketCmdException("invalid internal-address: $internalAddress")
        }

        buf.also {
            it.writeByte(internalAddress!!.toInt())
            it.writeByte(if (good) 0xAA else 0xCC)
        }
    }

    override fun parse(buf: ByteBuf): Boolean {
        if (buf.readableBytes() < MIN_LEN) {
            throw PacketDataLenException("should contain internal-address & result")
        }

        buf.duplicate().apply {
            internalAddress = readByte()
            if (internalAddress!! < 0x0B || internalAddress!! > 0x0E) {
                throw PacketCmdException("invalid internal-address: $internalAddress")
            }
            val b1 = readUnsignedByte()
            if (!(b1 == 0xAA.toShort() || b1 == 0xCC.toShort())) {
                throw PacketCmdException("should contain 0xAA(success) or 0xCC(fail): $b1")
            }
            good = b1 == 0xAA.toShort()
        }

        buf.skipBytes(MIN_LEN)

        return true
    }

    override fun count(): Int {
        return MIN_LEN
    }
}